//
//  UIDevice+Extension.m
//  Project
//
//  Created by 郑键 on 17/1/11.
//  Copyright © 2017年 zhengjian. All rights reserved.
//

#import "UIDevice+Extension.h"
#include <sys/socket.h> // Per msqr
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>

@interface UIDevice ()

@end

@implementation UIDevice (Extension)

#pragma mark - Private Methods

/**
 *  Return the local MAC addy
 *  Courtesy of FreeBSD hackers email list
 *  Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb.
 *
 *  @return mac address
 */
- (NSString *)macaddress
{
    int                 mib[6];
    size_t              len;
    char                *buf;
    unsigned char       *ptr;
    struct if_msghdr    *ifm;
    struct sockaddr_dl  *sdl;
    
    mib[0]              = CTL_NET;
    mib[1]              = AF_ROUTE;
    mib[2]              = 0;
    mib[3]              = AF_LINK;
    mib[4]              = NET_RT_IFLIST;
    
    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return NULL;
    }
    
    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }
    
    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!\n");
        return NULL;
    }
    
    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        free(buf);
        return NULL;
    }
    
    ifm                 = (struct if_msghdr *)buf;
    sdl                 = (struct sockaddr_dl *)(ifm + 1);
    ptr                 = (unsigned char *)LLADDR(sdl);
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
                           *ptr,
                           *(ptr+1),
                           *(ptr+2),
                           *(ptr+3),
                           *(ptr+4),
                           *(ptr+5)];
    free(buf);
    
    return outstring;
}

#pragma mark - Public Methods

/**
 *  获取当前应用唯一标识
 *
 *  @return 当前应用唯一标识 32位md5加密
 */
- (NSString *)uniqueDeviceIdentifier
{
    NSString *macaddress                                    = [[UIDevice currentDevice] macaddress];
    NSString *bundleIdentifier                              = [[NSBundle mainBundle] bundleIdentifier];
    NSString *stringToHash                                  = [NSString stringWithFormat:@"%@%@",macaddress,bundleIdentifier];
    NSString *uniqueIdentifier                              = [stringToHash ex_md5String];
    return uniqueIdentifier;
}

/**
 *  获取设备全球唯一标识
 *
 *  @return 设备全球唯一标识 32位md5加密
 */
- (NSString *)uniqueGlobalDeviceIdentifier
{
    NSString *macaddress                                    = [[UIDevice currentDevice] macaddress];
    NSString *uniqueIdentifier                              = [macaddress ex_md5String];
    return uniqueIdentifier;
}


@end
